package de.cms.kff.dao;

import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import de.cms.kff.model.Auto;
import de.cms.kff.model.Verleih;

/**
 * The Data access class for autos. All Interaction with the database regarding
 * the entity bean Auto should be handled by this class!
 */
public class AutoDao extends HibernateDaoSupport {
	private VerleihDao verleihDao;

	public void setVerleihDao(VerleihDao verleihDao) {
		this.verleihDao = verleihDao;
	}

	/**
	 * returns a auto by its primary db key.
	 * 
	 * @param id
	 * @return a Auto
	 */
	public Auto findById(int id) {
		HibernateTemplate template = getHibernateTemplate();
		return (Auto) template.get(Auto.class, id);
	}

	/**
	 * returns all autos from the database.
	 * 
	 * @return a list of Auto
	 * @see Auto
	 */
	public List<Auto> findAll() {
		HibernateTemplate template = getHibernateTemplate();
		return template.loadAll(Auto.class);
	}

	/**
	 * save the auto specified by the parameter in the database.
	 * 
	 * @param a
	 *            auto object that should be saved in the database
	 * @return the object specified by the parameter
	 */
	public Auto save(Auto auto) {
		HibernateTemplate template = getHibernateTemplate();
		template.saveOrUpdate(auto);
		return auto;
	}

	/**
	 * returns the list of autos which are currently not on a trip.
	 * 
	 * @return a List of Autos
	 */
	@SuppressWarnings("unchecked")
	public List<Auto> findFreie() {
		HibernateTemplate template = getHibernateTemplate();
		List<Verleih> aktuelleVerleihe = template
				.find("from Verleih v where v.bis is null");
		List<Auto> alle = template.loadAll(Auto.class);
		List<Auto> result = new LinkedList<Auto>();
		List<Auto> belegteAutos = new LinkedList<Auto>();
		for (Verleih verleih : aktuelleVerleihe) {
			belegteAutos.add(verleih.getAuto());
		}
		for (Auto auto : alle) {
			if (!belegteAutos.contains(auto)) {
				result.add(auto);
			}
		}
		return result;
	}

	/**
	 * delete a auto which the size of verleihe is 0.
	 * 
	 * @throws DaoException
	 */
	public void delete(Auto auto) throws DaoException {
		HibernateTemplate template = getHibernateTemplate();
		Set<Verleih> verleihe = verleihDao.findByAuto(auto);
		if (verleihe.size() == 0) {
			template.delete(auto);
		} else {
			throw new DaoException(
					"Das Auto kann nicht gelöscht werden, da bereits Verleihe mit diesem Auto durchgeführt worden sind.");
		}
	}

}